/*
 * Copyright 2013 JROSE
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jrose.api.config;

import lombok.Data;

import java.io.Serializable;

@Data
public class MongoConfig implements Serializable {
    private static final long serialVersionUID = 5269435286482301798L;

    private String replicaSet;

    // 单个主机连接到mongo实例允许的最大连接数。这其实相当于c3p0的maxPoolSize参数，mongo是内建连接池的，功能跟c3p0等差不多，
    // 超过了就会新建链接，默认值是10
    private int connectionsPerHost = 10;

    // 这个参数是跟connectionsPerHost配套的，当连接数超过connectionsPerHost的时候，需要建立新的连接，连接请求会被阻塞，
    // 这个参数就代表允许阻塞请求的最大值，超过这个值之后的请求都会报错。默认值5
    private int threadsAllowedToBlockForConnectionMultiplier = 5;

    // 线程等待链接可用的最长时间，ms单位，默认120,000，两分钟
    private int maxWaitTime = 120000;

    // 建立链接的超时时间。默认为0，代表永不超时
    private int connectTimeout = 10000;

    // 执行io操作的超时时间，默认为0，代表不超时
    private int socketTimeout = 0;

    // 为防火墙设置的，保证socket存活。默认false
    private boolean socketKeepAlive = false;

    // 自动重连，连接池都有的参数。但是在mongo里显的比较鸡肋，不管设置false还是true，mongo-java-driver本身就有重连机制，
    // 而且当是复制集的情况下，如果主库宕机，他只会重连宕机机器的ip，不知道这个是怎么处理的，以后看源码吧，默认false，看来本来也不建议打开
    private boolean autoConnectRetry = false;

    // 我去，坑爹啊，竟然是时间！默认为0，代表15s
    private int maxAutoConnectRetryTime = 0;

    // 用于读写分离，废弃了（mongo2.0/driver2.7）
    private boolean slaveOk = false;

    // 代表server的数量：。
    // w=-1 不等待，不做异常检查
    // w=0 不等待，只返回网络错误
    // w=1 检查本机，并检查网络错误
    // w>1 检查w个server，并返回网络错误
    private int writeNumber = 0;

    // 写操作超时的时间
    private int writeTimeout = 0;

    // 是不是等待刷新数据到磁盘
    private boolean writeFsync = false;

    // j：是不是等待提交的数据已经写入到日志，并刷新到磁盘，参见JOURNAL_SAFE的注释。
    // safe：相当于w=1,wtimeout=0，fsync和j为false，如果这几个指定了，safe不起作用。参见SAFE的注释
}
